<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

</body>

</html>

<script>
    // ES6新增了let命令，用来声明变量，它的用法类似于var,但是所声明的变量，只在let命令所在的代码块内有效。

    // var 关键字：函数作用域，全局作用域
    // if (true) {
    //     var a = 1;
    // }
    // console.log(a);

    // function test() {
    //     var b = 2;
    // }
    // test();
    // console.log(b);
    // let 关键字：块级作用域，局部作用域（花括号级的作用），不存在变量提升的 ，不能重复声明
    // if (true) {
    //     let c = 3;
    // }
    // console.log(c);
    // for (let i = 0; i < 10; i++) {
    //     console.log(i);
    // }

    // for(let i = 10; i < 20; i++){
    //     setTimeout(() => {
    //         console.log(i);
    //     }, 3000);
    // }

    // 在你的for循环中，最后一次满足条件的值是i = 9。这是因为循环条件是i < 10，所以在i达到10时，条件不再满足，循环停止。
    // 然而，当你在循环外部打印i的值时，它显示为10的原因是因为在最后一次循环迭代中，i首先被增加到10 (i++)，然后这个更新
    // 后的值被用来检查循环条件 (i < 10)。由于此时i已经等于10，条件不再成立，循环终止。因此，在循环结束后，i的值实际上
    // 是10，而不是9。
    //函数作用域与块级作用域区别
    var a = [];
    for (var i = 0; i < 10; i++) {
        a[i] = function(){
        console.log(i); // 0-9
        }
    }
    console.log(i); //10
    a[6](); // 10

    for (let i = 0; i < 10; i++) {
        a[i] = function(){
        console.log(i); // 0-9
        }
    }
    console.log(i); //10
    a[6](); // 6S

    //Let没有变量提升
    console.log(b); //undefined
    var b = 10;
    console.log(c); //报错  无法访问C
    let c = 10;

    //Let不能重复声明  不允许在相同作用域内，重复声明同一个变量
    var d = 10;
    var d = 20; 
    console.log(d);

    // let e = 10;
    // let e = 20; 
    // console.log(e); // 报错 标识符“e”已声明
</script>